AWS CDK で作成した GitHub OIDC provider に複数の thumbprint を登録してみた
こんにちは、CX事業本部 Delivery部の若槻です。
最近、GitHub から次のようなアナウンスがありました。
GitHub Actions で2つの SSL 中間証明書が使用されるようになったため、OIDC プロバイダーの thumbprint に次の2つの thumbprint の登録が必要となりました。
6938fd4d98bab03faadb97b34396831e3780aea1
1c58a3a8518e8759bf075b76b750d4f2df264fcd
今までは 6938fd4d98bab03faadb97b34396831e3780aea1
のみ登録されていれば良かったのですが、今後は上記の両方を登録しなければ、GitHub Actions からの AssumeRole が次のエントリで紹介しているエラー(※)となってしまいます。
※登録されていない証明書が通信に使用された場合
今回は、GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。
thumbprint を明示的に指定しない場合
以前に次のエントリで GitHub OIDC provider などの OIDC 連携に必要なリソースを AWS CDK を利用して構成する方法を紹介しました。
その際の CDK コードは下記(一部省略)となります。OIDC provider の作成は OpenIdConnectProvider
コンストラクトクラスを利用するのですが、その際に thumbprints
は未指定としています。
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkDeployGhOidcStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成 const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider( this, 'GitHubOidcProvider', { url: 'https://token.actions.githubusercontent.com', clientIds: ['sts.amazonaws.com'], } ); // 中略 } }
この時、CDK デプロイにより追加される thumbprint は 6938fd4d98bab03faadb97b34396831e3780aea1
のみとなっています。
$ aws iam get-open-id-connect-provider \ --open-id-connect-provider-arn ${PROVIDER_ARN} { "Url": "token.actions.githubusercontent.com", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "6938fd4d98bab03faadb97b34396831e3780aea1" ], "CreateDate": "2023-06-09T15:40:20.811000+00:00", "Tags": [] }
OpenIdConnectProvider
の仕様を確認する
次のドキュメントで OpenIdConnectProvider
コンストラクトクラスの仕様を確認してみます。
OpenIdConnectProvider
では、Construct Props でオプションとして thumbprints
を string[]
形式で指定できます。thumbprints
は OIDC provider のサーバー証明書の thumbprint のリストを登録できるので、今回のケースでまさに使いたかったプロパティです。
指定可能数は最大 5 つで、また未指定の場合はルート認証局の thumbprint がプロバイダーのサーバーから取得されます。現在既定で取得される thumbprint は前述した 6938fd4d98bab03faadb97b34396831e3780aea1
となっているようです。
thumbprint を明示的に指定してみる
それでは OpenIdConnectProvider
実際に thumbprint を明示的に指定してみます。アナウンスされていた2つの thumbprint を指定します。
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkDeployGhOidcStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成 const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider( this, 'GitHubOidcProvider', { url: 'https://token.actions.githubusercontent.com', clientIds: ['sts.amazonaws.com'], thumbprints: [ '6938fd4d98bab03faadb97b34396831e3780aea1', '1c58a3a8518e8759bf075b76b750d4f2df264fcd', ], } ); // 中略 } }
CDK デプロイすると、指定した2つの thumbprint が OIDC provider に登録されていることが確認できました。
$ aws iam get-open-id-connect-provider \ --open-id-connect-provider-arn ${PROVIDER_ARN} { "Url": "token.actions.githubusercontent.com", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "1c58a3a8518e8759bf075b76b750d4f2df264fcd", "6938fd4d98bab03faadb97b34396831e3780aea1" ], "CreateDate": "2023-06-09T15:40:20.811000+00:00", "Tags": [] }
その後は GitHub Actions での OIDC 連携も正常にできるようになりました。
登録できる thumbprint の制約
登録できる thumbprint には 40 文字以上のみという制約があります。文字数がそれ以下の thumbprint を指定してみます。
import { Stack, StackProps, aws_iam } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkDeployGhOidcStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成 const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider( this, 'GitHubOidcProvider', { url: 'https://token.actions.githubusercontent.com', clientIds: ['sts.amazonaws.com'], thumbprints: [ '6938fd4d98bab03faadb97b34396831e3780aea1', '1c58a3a8518e8759bf075b76b750d4f2df264fcd', 'hogehoge' ], } ); // 中略 } }
CDK デプロイすると次のエラーとなります。
failed: Error: The stack named cdkCicdResourcesStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Received response status [FAILED] from custom resource. Message returned: ValidationError: 1 validation error detected: Value '[1c58a3a8518e8759bf075b76b750d4f2df264fcd, 6938fd4d98bab03faadb97b34396831e3780aea1, hogehoge]' at 'thumbprintList' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 40, Member must have length greater than or equal to 40
文字列が短すぎると SSL 証明書の署名の意味を成さないので、この制約は当然といえば当然ですね。
おわりに
GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。
GitHub と AWS の OIDC 連携に使用している中間証明書は、時々変更や追加があるので、エラーが発生した場合にも焦らずに対処したいですね。
参考
以上